package com.tiger.project.service;

import com.tiger.common.core.domain.model.LoginUser;
import com.tiger.project.domain.ContractBill;
import com.tiger.project.domain.ContractSponsor;
import com.tiger.project.domain.req.DepositChange;
import com.tiger.project.domain.req.PartyInfo;
import com.tiger.project.domain.vo.ContractSponsorExportVo;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * 【合同发起】Service接口
 *
 * @author standard
 * @date 2022-09-22
 */
public interface IContractSponsorService {
    /**
     * 查询【合同发起】
     *
     * @param id 【合同发起】主键
     * @return 【合同发起】
     */
    public ContractSponsor selectContractSponsorById(Long id);

    /**
     * 查询押金管理详情
     */
    public ContractSponsor selectContractSponsorByDepositId(Long id);

    /**
     * 查询【合同发起】列表
     *
     * @param contractSponsor 【合同发起】
     * @return 【合同发起】集合
     */
    public List<ContractSponsor> selectContractSponsorList(ContractSponsor contractSponsor);


    public List<ContractSponsor> selectContractSponsorPigeonholeList(ContractSponsor contractSponsor);


    /**
     * 查询【合同预警】列表
     *
     * @param contractSponsor 【合同预警】
     * @return 【合同预警】集合
     */
    public List<ContractSponsor> selectContractSponsorWarningList(ContractSponsor contractSponsor);

    /**
     * 新增【合同发起】
     *
     * @param contractSponsor 【合同发起】
     * @return 结果
     */
    public int insertContractSponsor(ContractSponsor contractSponsor, LoginUser loginUser) throws ParseException;

    /**
     * 修改【合同发起】
     *
     * @param contractSponsor 【合同发起】
     * @return 结果
     */
    public int updateContractSponsor(ContractSponsor contractSponsor) throws ParseException;

    //押金管理变更
    public int updateReceiptDeposit(ContractSponsor contractSponsor);

    public int updateContractSponsorPigeonhole(ContractSponsor contractSponsor);

    /**
     * 批量删除【合同发起】
     *
     * @param ids 需要删除的【合同发起】主键集合
     * @return 结果
     */
    public int deleteContractSponsorByIds(Long[] ids);

    /**
     * 删除【合同发起】信息
     *
     * @param id 【合同发起】主键
     * @return 结果
     */
    public int deleteContractSponsorById(Long id);

    /**
     * 合同变更
     *
     * @param contractSponsor 【合同变更】
     * @return 结果
     */
    public int alterContractSponsor(ContractSponsor contractSponsor) throws ParseException;


    //合同预警数量
    public List<Map<String, Object>> warningCount(String letWay, Long companyId);


    //生成账单
    public List<ContractBill> bill(Date rentStateTime, Date rentEndTime, String paymentCycle, BigDecimal yearlyRent, Long contractSponsorId, Boolean isAlter) throws ParseException;

    public List<ContractBill> billCopy(Date rentStateTime, Date rentEndTime, String paymentCycle, BigDecimal yearlyRent, Long contractSponsorId, Boolean isAlter) throws ParseException;

    //合同发起 审核回调
    public int callBack(Long id, Long status, String oaFile);


    //押金管理 押金变更
    public int callBackDeposit(Long id, String oaFile, BigDecimal cashPledge,String depositRemark,
                               String depositDecisionId,Long depositStatus);

    //押金管理 押金收款
    public int callBackDepositPayee(Long id, String oaFile,BigDecimal depositPayeeMoney,String depositPayeeNum,
                                    String depositPayeeFile,Long depositPayeeStatus,Date depositPayeeTime);

    //押金管理 押金退款
    public int callBackDepositRefund(Long id, String oaFile,BigDecimal depositRefundMoney,String depositRefundNum,
                                    String depositRefundFile,Long depositRefundStatus,Date depositRefundTime);



    /**
     * 合同分配列表
     */
    public List<ContractSponsor> selectContractSponsorAllocation(ContractSponsor contractSponsor);

    /**
     * 合同分配详情
     */
    public ContractSponsor selectContractSponsorAllocationById(Long id);


    /**
     * 总分配金额
     */
    public BigDecimal noAllotMoney(Long id);

    /**
     * 总计租率
     *
     * @param id
     * @return
     */
    public Map<String, Object> getTotalRentalRate(Long id);

    /**
     * 总出租率: 已出租房源租租赁面积累加/总房源可租面积累加
     *
     * @param id
     * @return
     */
    public Map<String, Object> getTotalLettingRate(Long id);

    /**
     * 总计租均价: 租金总额/∑(计租面积 x 计租天数)
     *
     * @param id
     * @return
     */
    public Map<String, Object> getAverageRentalPrice(Long id);

    /**
     * 总平效: Σ日租金单价*计租天数/(总可出租面积 x 总时长)
     *
     * @param id
     * @return
     */
    public Map<String, Object> getTotalUtilityEquality(Long id);

    /**
     * 账面平效排行榜
     */
    public List<Map<String, Object>> getBookValueUtilityEqualityRanking(Long companyId);

    /**
     * 总收益: 总可租面积 x 计租率 x 计租均价 x 天数
     *
     * @param id
     * @return
     */
    public Map<String, Object> getTotalEarnings(Long id);

    /**
     * 逾期金额 + 逾期租客数量 + 收缴率 + 逾期率 + 逾期金额占比
     *
     * @param id
     * @return
     */
    public Map<String, Object> getRentCollection(Long id);

    /**
     * 开票金额和减免金额
     */
    public Map<String, Object> getInvoiceAndCredit(Long companyId);

    /**
     * 逾期租户比率
     *
     * @param id
     * @return
     */
    public Map<String, Object> getCountOverdueLesseeRate(Long id);

    /**
     * 逾期率排名
     *
     * @param id
     * @return
     */
    public List<Map<String, Object>> getOverdueLesseeRateRanking(Long id);

    /**
     * 逾期金额排名
     *
     * @param id
     * @return
     */
    public List<Map<String, Object>> getOverdueLesseeAmountRanking(Long id);

    /**
     * 租户总已缴租金排名
     *
     * @param id
     * @return
     */
    public List<Map<String, Object>> getCaptureLesseeAmountRanking(Long id);

    /**
     * 总效益流失率
     *
     * @param id
     * @return
     */
    public Map<String, Object> getTotalRateOfLossOfBenefits(Long id);

    /**
     * 租金流失总额
     *
     * @param id
     * @return
     */
    public Map<String, Object> getTotalRentLoss(Long id);

    /**
     * 创建时间排前10的合同
     *
     * @param id
     * @return
     */
    public List<ContractSponsor> getTop10ByCreateAt(Long id);

    /**
     * 导出excel所需的出租资产数据
     * @param id
     * @return
     */
    public List<ContractSponsorExportVo> idleList(Long id);

    /**
     * 合同分类 + 出租类型
     * @param companyId
     * @return
     */
    public List<Map<String, Object>> getContractSponsorType(Long companyId);

    /**
     * 租金收缴 近12个月：待付（应收）
     */
    public List<Map<String, Object>> getContractSponsorReceivable(Long companyId);

    /**
     * 租金收缴 近12个月：已收（实收）
     */
    public List<Map<String, Object>> getContractSponsorReceipts(Long companyId);

    /**
     * 租金收缴 近12个月：减免
     */
    public List<Map<String, Object>> getContractSponsorCredit(Long companyId);

    /**
     * 营业外收入与支出
     */
    public Map<String, Object> getIncomingsAndOutgoings(Long companyId);

    /**
     * 查询出租情况啊（出租面积+出租金额+出租率+收缴率）
     */
    public Map<String, Object> getRentDetail(Long companyId);
}
